# -*- coding: utf-8 -*-
"""
------------------------------------------------------------------------------
    File Name:  stack
    Author   :  wanwei1029
    Date     :  2018/2/11
    Desc     : stack,hstack,vstack的用法。
              参考：http://blog.csdn.net/csdn15698845876/article/details/73380803
------------------------------------------------------------------------------
"""
import sys
import logging
import numpy as np

logger = logging.getLogger("stack")
formatter = logging.Formatter('%(asctime)s %(levelname) -8s: %(message)s')
console_handler = logging.StreamHandler(sys.stdout)
logger.addHandler(console_handler)
logger.setLevel(logging.INFO)


def test_stack():
    """
    stack是堆叠的意思，也就是把几个数组以一定的方式合并在一起。这里我们首先要认清它的参数，stack的参数可以是元组，列表或ndarray
    而我们要堆叠的就是这些元组（或列表等，下同）里的元素。
    注意：堆叠过后，相对于这些元素，结果的维度会加1。
    如果元组里是常量，此时对应的axis只能为0，结果就是一个包含所有元素的一维数组，维度加1了,常量stack用处不大。
    如果元组里是一维数组，axis可以是0和1，为0时就是一维数组
    :return: void
    """
    logger.info("常量stack的结果为：{0}".format(np.stack([1, 2, 3])))
    list_a = [1, 2, 3]
    list_b = [4, 5, 6]
    list_c = [7, 8, 9]
    logger.info("一维stack,axis=0的结果为：{0}".format(np.stack([list_a, list_b, list_c], axis=0)))
    logger.info("一维stack,axis=1的结果为：{0}".format(np.stack([list_a, list_b, list_c], axis=1)))
    a = [[1, 4], [2, 5], [3, 6]]
    b = [[11, 14], [12, 15], [13, 16]]
    c = [[21, 24], [22, 25], [23, 26]]
    d = [[31, 34], [32, 35], [33, 36]]
    # 二维数组stack的理解，比如abcd本来的shape为3*2，stack的axis值，就是要替换的维度，具体说就是插在替换的之前。
    # 比如axis=0, 之前的二维对应的是3，叠加后的新shape就是4*3*2
    # 比如axis=1, 之前的二维对应的是2，叠加后的新shape就是3*4*2
    # 比如axis=2, 之前二维没有对应的，加上最后，叠加后的新shape就是3*2*4
    # 所以，我们要确认生成后的数组，第一步就是确定其对应的shape
    logger.info("二维stack,axis=0的结果为：{0}".format(np.stack([a, b, c, d], axis=0)))
    logger.info("二维stack,axis=1的结果为：{0}".format(np.stack([a, b, c, d], axis=1)))
    logger.info("二维stack,axis=2的结果为：{0}".format(np.stack([a, b, c, d], axis=2)))


def test_hvstack():
    """
    hstack函数就是把数组最后的一维加起来，所以它不会增加数组的维度
    vstack函数就是把数组的第一个维度加起来，也不会增加数组的维度（一维会增加，变成二维）
    :return: void
    """
    list_a = [[1, 11], [2, 22], [3, 33]]
    list_b = [[4, 44], [5, 55], [6, 66]]
    list_c = [[7, 77], [8, 88], [9, 99]]
    # a,b,c三个数组的shape都是3*2, hstack后就是3*(2*3)
    hstack = np.hstack((list_a, list_b, list_c))
    logger.info("hstack is {0}".format(hstack))
    # 同上，vstack后shape为（3*3）*2
    vstack = np.vstack([list_a, list_b,list_c])
    logger.info("vstack is {0}".format(vstack))


if __name__ == '__main__':
    test_method = "test_hvstack"
    if test_method == "test_hvstack":
        test_hvstack()
    elif test_method == "test_stack":
        test_stack()